import fs from 'fs';
import path from 'path';
import { formatDateTime } from "./dateFormatter.js"; // 导入日期格式化函数

/**
 * 日志工具，用于记录系统日志
 */
class Logger {
	constructor() {
		// 创建logs目录（如果不存在）
		this.logsDir = path.join(process.cwd(), "logs");
		if (!fs.existsSync(this.logsDir)) {
			fs.mkdirSync(this.logsDir, { recursive: true });
		}

		// 日志文件路径
    this.errorLogPath = path.join(this.logsDir, "error.log");
    this.accessLogPath = path.join(this.logsDir, "access.log");
    this.debugLogPath = path.join(this.logsDir, "debug.log");
    this.warnLogPath = path.join(this.logsDir, "warn.log");
	}
	/**
	 * 记录普通信息日志
	 * @param {string} message 日志信息
	 */
	info(message) {
		const now = new Date();
		const dateStr = formatDateTime(now);

		// 构建日志内容
		let logContent =
			"----------------------------------------------------------------------------\n";
		logContent += `${dateStr} \n`;
		logContent += `error: ${message}`;
		logContent +=
			"\n----------------------------------------------------------------------------\n";

		// 确保路径存在后再写入
    if (this.accessLogPath) {
			// 追加写入访问日志文件
			fs.appendFileSync(this.accessLogPath, logContent);
		}

		// 开发环境下输出到控制台
		if (process.env.NODE_ENV === "development") {
			console.log(dateStr, message);
		}
	}

	/**
	 * 记录错误日志
	 * @param {string} message 错误信息
	 * @param {Error|null} error 错误对象
	 */
	error(message, error = null) {
		const now = new Date(); // 获取当前日期时间
		const dateStr = formatDateTime(now); // 格式化日期时间

		// 构建日志内容
		let logContent =
			"----------------------------------------------------------------------------\n";
		logContent += `${dateStr} \n`;
		logContent += `error: ${message}`;

		if (error && error.stack) {
			logContent += `\n${error.stack}`;
		}

		logContent +=
			"\n----------------------------------------------------------------------------\n";

		// 确保路径存在后再写入
		if (this.errorLogPath) {
      // 追加写入日志文件
			fs.appendFileSync(this.errorLogPath, logContent);
		}
		// 同时输出到控制台
    console.log(dateStr, message);
    
		if (error && error.stack && process.env.NODE_ENV === "development") {
			console.error(error.stack);
		}
	}

	/**
	 * 记录调试日志
	 * @param {string} message 调试信息
	 * @param {Object} [data] 附加数据对象
	 */
	debug(message, data) {
		// 仅在开发环境记录调试日志
		if (process.env.NODE_ENV === "development") {
			const now = new Date();
			const dateStr = formatDateTime(now);
			// 构建日志内容
			let logContent =
				"----------------------------------------------------------------------------\n";
			logContent += `${dateStr} \n`;
			logContent += `debug: ${message}`;
			if (data) {
				logContent += `\n${JSON.stringify(data, null, 2)}`;
			}
			logContent +=
				"\n----------------------------------------------------------------------------\n";
			// 确保路径存在后再写入
			if (this.debugLogPath) {
				fs.appendFileSync(this.debugLogPath, logContent);
			}
			// 开发环境下输出到控制台
			console.debug(dateStr, message);
		}
	}

	/**
	 * 记录警告日志
	 * @param {string} message 警告信息
	 */
	warn(message) {
		const now = new Date();
		const dateStr = formatDateTime(now);

		// 构建日志内容
		let logContent =
			"----------------------------------------------------------------------------\n";
		logContent += `${dateStr} \n`;
		logContent += `warn: ${message}`;
		logContent +=
			"\n----------------------------------------------------------------------------\n";

		// 确保路径存在后再写入
		if (this.warnLogPath) {
			// 追加写入警告日志文件
			fs.appendFileSync(this.warnLogPath, logContent);
		}

		// 开发环境下输出到控制台
		if (process.env.NODE_ENV === "development") {
			console.warn(dateStr, message);
		}
	}
}

// 导出单例
export default new Logger();
